home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Merciful 5
/
Merciful - Disc 5.iso
/
software
/
p
/
pcqpascalv1.2d.lha
/
Examples2
/
Clipboard
/
ReadClip.p
next >
Wrap
Text File
|
1997-05-06
|
4KB
|
158 lines
Program ReadClip;
{ ReadClip - liest Text aus dem Clipboard
Die Routine ist so geschrieben, daß sie leicht in
eigene Programme eingebaut werden kann.
PUBLIC DOMAIN
Andreas Tetzl A.Tetzl@saxonia.de
}
{$I "Include:Exec/Devices.i"}
{$I "Include:Exec/IO.i"}
{$I "Include:Devices/ClipBoard.i"}
{$I "Include:Exec/Memory.i"}
{$I "Include:Utils/IOUtils.i"}
{$I "Include:DOS/DOS.i"}
{$I "Include:Utils/StringLib.i"}
VAR Str : String;
err : Integer;
{///"FUNCTION CreateExtIO"}
FUNCTION CreateExtIO( iop : MsgPortPtr; iosize : Integer) : Address;
VAR
ExtIO : IOStdReqPtr;
Begin
If iop = NIl then CreateExtIO := NIL;
ExtIO := AllocMem( iosize, Memf_Public+Memf_Clear );
If ExtIO = NIL then CreateExtIO := NIL;
With ExtIO^.io_message do begin
mn_node.ln_Type := NT_Message;
mn_Length := iosize;
mn_ReplyPort := iop;
End;
CreateExtIO := ExtIO;
End;
{///}
{///"PROCEDURE DeleteExtIO"}
Procedure DeleteExtIO( iorp : IOStdReqPtr );
Begin
With iorp^ do begin
io_Message.mn_node.ln_Type := $FF;
io_Device := Address( -1 ); { * Verstümmeln *}
io_Unit := Address( -1 );
End;
FreeMem( iorp, iorp^.io_Message.mn_Length ); { * Speicher freigeben * }
End;
{///}
{ /// ------------------------- "FUNCTION ReadClip" ------------------------- }
FUNCTION ReadClip(Unit : Byte; Buffer : String; BufferSize : Integer) : Integer;
{ Parameter:
Unit : Unit des Clipboard.device (normalerweise 0)
Buffer : String, in den der Inhalt des Clipboards kopiert wird.
BufferSize : Größe des Buffers
}
{ Rückgabe:
0 : Alles OK
1 : Clipboard.device konnte nicht geöffnet werden
2 : Kein IFF-FTXT-File (kein Text im Clipboard)
3 : Nicht genug Speicher
}
VAR err : Integer;
MyPort : MsgPortPtr;
MyReq : IOClipReqPtr;
Chunk : String;
len, cklen : Integer;
buf : Address;
PROCEDURE Clip_Read(Buffer : Address; size : Integer);
BEGIN
MyReq^.io_Command:=CMD_READ;
MyReq^.io_Data:=Buffer;
MyReq^.io_Length:=size;
err:=DoIO(MyReq);
END;
Begin
StrCpy(Str,"");
MyPort:=CreatePort(NIL,0);
If MyPort=NIL then ReadClip:=1;
MyReq:=CreateExtIO(MyPort,SizeOf(IOClipReq));
If MyReq=NIL then
Begin
DeletePort(MyPort);
ReadClip:=1;
end;
{ Clipboard.device öffnen }
err:=OpenDevice("clipboard.device",UNIT,MyReq,0);
If err<>0 then
Begin
DeleteExtIO(IoStdReqPtr(MyReq));
DeletePort(MyPort);
ReadClip:=1;
end;
Chunk:=AllocString(5);
Clip_Read(Chunk,4); { FORM-Kennung lesen }
Clip_Read(@len,4); { Länge lesen }
len:=len+8; { gesamte Dateilänge }
Clip_Read(Chunk,4); { IFF-Typ lesen }
If StrEq(Chunk,"FTXT")=FALSE then
BEGIN
CloseDevice(MyReq);
DeleteExtIO(IoStdReqPtr(MyReq));
DeletePort(MyPort);
ReadClip:=2;
END;
While MyReq^.io_Offset<len do
BEGIN
Clip_Read(Chunk,4); { Chunk-Kennung lesen }
Clip_Read(@cklen,4); { Chunk-länge lesen }
buf:=AllocMem(cklen,MEMF_ANY);
If buf=NIL then ReadClip:=3;
Clip_Read(buf,cklen); { Daten lesen }
If StrEq(Chunk,"CHRS") then { CHRS-Chunk gefunden }
BEGIN
If cklen<buffersize then buffersize:=cklen;
StrnCpy(Buffer,buf,buffersize); { Daten kopieren }
END;
FreeMem(buf,cklen); { Speicher freigeben }
END;
CloseDevice(MyReq);
DeleteExtIO(IoStdReqPtr(MyReq));
DeletePort(MyPort);
end;
{ /// ------------------------------------------------------------------------ }
{ /// -------------------------------- "Main" -------------------------------- }
BEGIN
Str:=AllocString(100);
err:=ReadClip(0,Str,99);
Writeln(Str);
FreeString(Str);
END.
{ /// ------------------------------------------------------------------------ }